#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
导出服务模块
负责将查询结果导出为不同格式的文件
"""

import logging
import os
import json
from pathlib import Path
from typing import Dict, List, Optional, Union, Any, Tuple

from PySide6.QtCore import QObject, Signal

from config.constants import SUPPORTED_EXPORT_FORMATS


# 初始化日志记录器
logger = logging.getLogger("export_service")


class ExportService(QObject):
    """导出服务类，处理查询结果导出"""
    
    # 信号定义
    export_started = Signal(str)  # 导出格式
    export_completed = Signal(bool, str)  # 成功标志, 文件路径或错误消息
    export_progress = Signal(int, int)  # 当前进度, 总进度
    
    def __init__(self):
        """初始化导出服务"""
        super().__init__()
        
    def export_data(self, data: object, file_path: str, 
                   format_type: Optional[str] = None) -> Tuple[bool, str]:
        """导出数据到文件
        
        Args:
            data: 要导出的数据（行数据列表）
            file_path: 导出文件路径
            format_type: 导出格式类型，如果为None则根据文件扩展名判断
            
        Returns:
            (成功标志, 消息)
        """
        try:
            # 发出开始信号
            if format_type:
                self.export_started.emit(format_type)
            
            # 确保目录存在
            file_dir = os.path.dirname(os.path.abspath(file_path))
            if file_dir:
                os.makedirs(file_dir, exist_ok=True)
            
            # 确定导出格式
            if not format_type:
                format_type = self._detect_format_from_path(file_path)
            
            # 验证数据
            if not data or len(data) == 0:
                return False, "没有数据可导出"
            
            # 根据格式导出
            format_type = format_type.upper()
            total_rows = len(data)
            
            # 更新进度
            self.export_progress.emit(0, total_rows)
            
            if format_type == "CSV":
                self._export_csv_direct(data, file_path)
            elif format_type == "EXCEL":
                self._export_excel_direct(data, file_path)
            elif format_type == "JSON":
                self._export_json_direct(data, file_path)
            else:
                raise ValueError(f"不支持的导出格式: {format_type}")
            
            # 更新最终进度
            self.export_progress.emit(total_rows, total_rows)
            
            # 发出完成信号
            self.export_completed.emit(True, file_path)
            return True, f"成功导出 {total_rows} 行数据到 {file_path}"
            
        except Exception as e:
            logger.error(f"导出数据失败: {str(e)}")
            # 发出完成信号（失败）
            self.export_completed.emit(False, str(e))
            return False, f"导出数据失败: {str(e)}"
    
    def _detect_format_from_path(self, file_path: str) -> str:
        """根据文件路径检测导出格式
        
        Args:
            file_path: 文件路径
            
        Returns:
            导出格式
        """
        suffix = Path(file_path).suffix.lower()
        
        if suffix == ".csv":
            return "CSV"
        elif suffix in [".xlsx", ".xls"]:
            return "EXCEL"
        elif suffix == ".json":
            return "JSON"
        else:
            raise ValueError(f"无法从文件扩展名 {suffix} 确定导出格式")
    
    def _export_csv_direct(self, data: List[List], file_path: str) -> None:
        """直接导出为CSV格式
        
        Args:
            data: 行数据列表
            file_path: 文件路径
        """
        import csv
        
        with open(file_path, 'w', newline='', encoding='utf-8') as csvfile:
            writer = csv.writer(csvfile)
            
            # 写入数据行
            for row in data:
                # 处理None值
                processed_row = []
                for cell in row:
                    if cell is None:
                        processed_row.append('')
                    else:
                        processed_row.append(str(cell))
                writer.writerow(processed_row)
        
        logger.info(f"成功导出CSV到 {file_path}")
    
    def _export_excel_direct(self, data: List[List], file_path: str) -> None:
        """直接导出为Excel格式
        
        Args:
            data: 行数据列表
            file_path: 文件路径
        """
        try:
            import pandas as pd
            
            # 转换为DataFrame
            df = pd.DataFrame(data)
            df.to_excel(file_path, index=False, header=False)
            
        except ImportError:
            # 如果没有pandas，尝试使用openpyxl
            try:
                import openpyxl
                from openpyxl import Workbook
                
                wb = Workbook()
                ws = wb.active
                
                # 添加数据行
                for row in data:
                    # 处理None值
                    processed_row = []
                    for cell in row:
                        if cell is None:
                            processed_row.append('')
                        else:
                            processed_row.append(cell)
                    ws.append(processed_row)
                
                wb.save(file_path)
                
            except ImportError:
                # 如果都没有，则改为导出CSV
                csv_path = file_path.replace('.xlsx', '.csv').replace('.xls', '.csv')
                self._export_csv_direct(data, csv_path)
                logger.warning(f"无法导出Excel格式，已导出为CSV: {csv_path}")
                raise ValueError("缺少Excel导出所需的库（pandas或openpyxl），已改为导出CSV")
        
        logger.info(f"成功导出Excel到 {file_path}")
    
    def _export_json_direct(self, data: List[List], file_path: str) -> None:
        """直接导出为JSON格式
        
        Args:
            data: 行数据列表
            file_path: 文件路径
        """
        # 由于没有列名信息，我们将每行作为数组导出
        # 或者可以使用通用的列名如 "column_0", "column_1" 等
        
        # 确定列数
        max_cols = max(len(row) for row in data) if data else 0
        
        # 生成通用列名
        columns = [f"column_{i}" for i in range(max_cols)]
        
        # 构建JSON数据
        result = []
        for row in data:
            obj = {}
            for i, col in enumerate(columns):
                if i < len(row):
                    obj[col] = row[i]
                else:
                    obj[col] = None
            result.append(obj)
        
        # 写入JSON文件
        with open(file_path, 'w', encoding='utf-8') as f:
            json.dump(result, f, ensure_ascii=False, indent=2, default=str)
        
        logger.info(f"成功导出JSON到 {file_path}")
    
    def get_supported_formats(self) -> List[Dict[str, str]]:
        """获取支持的导出格式
        
        Returns:
            格式列表
        """
        formats = []
        
        for format_type in SUPPORTED_EXPORT_FORMATS:
            if format_type == "CSV":
                formats.append({
                    "name": "CSV",
                    "description": "CSV文件 (*.csv)",
                    "extension": "csv"
                })
            elif format_type == "EXCEL":
                formats.append({
                    "name": "Excel",
                    "description": "Excel文件 (*.xlsx)",
                    "extension": "xlsx"
                })
            elif format_type == "JSON":
                formats.append({
                    "name": "JSON",
                    "description": "JSON文件 (*.json)",
                    "extension": "json"
                })
                
        return formats


# 单例实例
_export_service_instance = None

def get_export_service() -> ExportService:
    """获取导出服务单例实例
    
    Returns:
        ExportService实例
    """
    global _export_service_instance
    if _export_service_instance is None:
        _export_service_instance = ExportService()
    return _export_service_instance
